﻿using CommonUtil.Const;
using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
using System.Text.RegularExpressions;

namespace DataAccess
{
    public class BaseDAO
    {
        private IDbConnector dataBaseConnector = null;

        public BaseDAO()
        {

        }

        public BaseDAO(IDbConnector connector)
        {
            this.dataBaseConnector = connector;
        }



        /// <summary>
        /// DB接続管理
        /// </summary>
        /// <remarks></remarks>
        public IDbConnector Connector
        {
            get { return this.dataBaseConnector; }
            set { this.dataBaseConnector = value; }
        }


        /// <summary>
        /// SQL検索条件処理
        /// </summary>
        /// <param name="sqlBuilder">SQL文</param>
        /// <param name="conditions">検索フィールド</param>
        /// <remarks>Create by Chen</remarks>
        protected void appendWhereStatement(StringBuilder sqlBuilder, List<String> conditions)
        {
            // 検索フィールドがある場合
            if (conditions.Count > 0)
            {
                // WHEREキーワードを追加する
                sqlBuilder.Append("  WHERE");
            }
            else
            {
                return;
            }

            // SQLに条件を追加する
            sqlBuilder.Append("  " + conditions[0] + " LIKE :" + Regex.Replace(conditions[0], "(\\.)", "_") + " ESCAPE '" + CommonConst.StringMark.ESCAPE_SHARP + "'");
            for (int i = 1; i < conditions.Count - 1; i++)
            {
                sqlBuilder.Append("  AND " + conditions[i] + " LIKE :" + Regex.Replace(conditions[i], "(\\.)", "_") + " ESCAPE '" + CommonConst.StringMark.ESCAPE_SHARP + "'");
            }
        }

        /// <summary>
        /// 指定されたテーブルと列の一覧を使用して、SELECT ステートメントを作成します。
        /// </summary>
        /// <param name="dataTable">テーブル</param>
        /// <returns>SELECT ステートメント</returns>
        /// <remarks>Create by You</remarks>
        public String createSelectStatement(DataTable dataTable)
        {
            //セレクトステートメント
            StringBuilder selectStatement = new StringBuilder();

            selectStatement.AppendLine("SELECT ");
            selectStatement.AppendLine("        ").Append(dataTable.Columns[0].ColumnName);

            //すべてのコラムを使用してセレクトステートメント文を生成します
            for (int i = 1; i < dataTable.Columns.Count - 1; i++)
            {
                selectStatement.AppendLine("       ,").Append(dataTable.Columns[i].ColumnName);
            }

            return selectStatement.ToString();
        }
    }
}
